其他
火山引擎宋慎义:RTC技术核心挑战及发展趋势
一、实时性
信源
在2%的容错率情况下:视频可以通过关键帧,音频可以通过netEQ的方式容错。
如果需要更高的容错率,就需要对信源进行分层冗余,例如,视频的SVC有时域、空域的区别;音频MDC会有多描述编码;包括现在比较流行的AI Codec,本质上是保留最重要最核心的语音信号,其他信号可以忽略。
信道
如何FEC实现更低延时?
如何调节重传,实现更高可靠性?
如何把信道分离,保证重要数据能够快速、优先传递,不重要数据可以丢弃或暂缓?
信道策略
二、富媒体
三、多人互动
在人数比较少的情况下,可以使用网状SFU(大多数RTC架构采用的方式),相对简单,又可以实现全量交换,但服务端很容易遇到转发瓶颈;同时,因为每个人都是对等的,当人数很多,快速进房退房时,会产生信令的广播风暴。 针对这个问题的优化策略是给用户分角色,把静默用户(只观看、不上麦、不开摄像头)区分出来,这样的用户进出房间就不广播,极大减少信令。 另外对于这种超大房间,网状拓扑也不太合适。需要把大房间里面的嘉宾的信号变成树状拓扑。 同时当房间人数多的时候,信令广播消息比较大时,需要接入连接复用,压缩信令。
网状拓扑变成树状拓扑,可以解决几百人规模互动存在的问题,但如果想达到更高的互动,还需要继续优化。 例如音频选路风暴 :在一个房间内无论有多少人在听,绝大多数RTC系统都只会选择声音最大的几路音频。那么选路过程中会有比较大工作量。客户端不会同时拉几路流,边缘计算也没有办法同时拉几路流,因为如果所有边缘节点都同时拉所有音频流的话,整体传输量非常巨大。所以我们把一个房间内的所有音频在一个源站上进行聚合并选出全局的TOP3,然后集中进行分发,这样音频链路与视频链路就自然分开了。 另外在多人场景下,自动订阅优势会产生突发的信令。例如:当一个房间内有几十万用户,一个嘉宾忽然进入,会让所有用户同时订阅这个嘉宾,这时需要关闭自动订阅,开启按需订阅。因为每个用户看到的嘉宾可能是不一样的,一般情况下一个用户最多观看“5*5”、“7*7”个嘉宾的视频,就不能让用户都去自动订阅相同的嘉宾,用户可以根据自己选中的按需订阅。 在上述的场景下,信令的推送也是非常大的压力。所以我们把信令架构变成分布式信令,进行并发推送。最终实现服务端O(N)的复杂度(N指用户数量),在客户端实现O(1)的复杂度。也就是理论上如果一个客户端最多能同时观看“7*7”49个人的视频,同时听到3路音频的话,那么随着人数上涨,他的计算量和网络带宽不会随之增加。
大讲堂模式:可以实现50嘉宾和100万观众。 研讨会模式:可以实现1000嘉宾和1万个观众。
四、全球化
快速进房:如果一个RTC系统是全球化的,传统的房间服务是中心化的,那么在地球另一端的用户进房速度就会非常慢。 分布式房间:火山引擎的解决方案是使用分布式房间。同时,将用户进行分类,例如有一些用户是观众,他的信息没有必要扩散给其他人,所以我们把信令进行了拆分,在全球做了多个信令中心,可以下沉到离用户最近的边缘节点;只针对发言的嘉宾把信息异步通知到其他信令中心,而观众的信令不变,那么观众也不会被其他的信令中心感知到,实现了快速进房。 分发生成树:当一个房间在全球化多中心场景下,且人数特别多时,当全球节点达到几千的量级,那么单机计算生成树会变慢。为了实现快速进房,同时房间内有新嘉宾发言开关摄像头的时候,所有用户都能够快速感知,就要在全球多个中心并发计算生成树。这时会有一些冲突的情况,需要实时进行回环检测。由于用户的变化是动态的,也要实时进行节点的分裂与合并。最终还需要考虑每个用户端到端延时的要求,这就要求实现大致平衡的生成树。另外出于容灾的考虑,整个生成树还需要能够快速动态重建。
稳定性:如果要实现全球化的高可用,仅依靠业务侧的优化或应用层的优化是不够的,必须实现更底层的优化。火山引擎打造一个广域网的SDN系统,能够将流转变为包级别进行转发。 这是一个数据链路层的Overlay网络,相当于把我们之前局域网上的 SDN 搬到了公网上。当然这也面临一些新挑战,例如公网上的节点多种多样,且数量庞大,当达到上千的量级的时候,单一的路由中心也不能管理了。 于是我们又建设了分布式的路由表,而且本身的这个二层Overlay网络的传输能力也是能够根据 payload 进行分级QoS的。有了这个系统,节点和区域的故障就能够实现秒级感知和切换。 经过上述优化,火山引擎RTC能够实现全球传输延迟PCT995 200毫秒以内、全球端到端延迟PCT95 400毫秒以内,全球接入可用性达99.9%以上,全球转发可控性达99.9%以上。
五、RTC+X
更多阅读